菜鸟教程小白 发表于 2022-12-13 03:38:06

ios - 在 NSURLSession 中发布 json 字符串


                                            <p><p>在我的 iOS 应用程序中,我使用这样的 NSURLConnection 将 json 字符串发布到服务器。</p>

<pre><code>    post_string = @&#34;{&#34;function&#34;:&#34;getHuddleDetails&#34;, &#34;parameters&#34;: {&#34;user_id&#34;: &#34;167&#34;,&#34;location_id&#34;: &#34;71&#34;,&#34;huddle_id&#34;: &#34;328&#34;,&#34;checkin_id&#34;: &#34;1287&#34;},&#34;token&#34;:&#34;&#34;}&#34;


-(void)myServerRequests:(NSString *)post_string{


    NSData *postData = ;
    NSString *postLength = ];

    NSMutableURLRequest *request = [ init];
    ];
    ;

    ;
    ;
    ;
    ;

    conn = [ initWithRequest:request delegate:self];
    if (conn) {
      webData = [init];
    }

   }
</code></pre>

<p>并使用以下代码使用 NSURLSession 发布 <strong>multipart/form-data</strong>(不是 JSON)</p>

<pre><code> -(void)myFunction:(NSString *)user_name paswd:(NSString *)pass_word {

   NSString *boundary = ;
   NSMutableURLRequest *request = ];
   ;
    forHTTPHeaderField:@&#34;Content-Type&#34;];



   NSURLSessionConfiguration *configuration = ;
   NSURLSession *session = ;

   NSMutableData *postbody = ;
dataUsingEncoding:NSUTF8StringEncoding]];




    dataUsingEncoding:NSUTF8StringEncoding]];
    dataUsingEncoding:NSUTF8StringEncoding]];


    dataUsingEncoding:NSUTF8StringEncoding]];
    dataUsingEncoding:NSUTF8StringEncoding]];

    dataUsingEncoding:NSUTF8StringEncoding]];




   NSURLSessionUploadTask *task = [session uploadTaskWithRequest:request fromData:postbody completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    NSAssert(!error, @&#34;%s: uploadTaskWithRequest error: %@&#34;, __FUNCTION__, error);


      NSString *jsonString = [ initWithData:data encoding:NSUTF8StringEncoding] ;



    }];
    ;
}
</code></pre>

<p>这对 NSURLSession 非常有效,但是当我尝试发布 json 字符串(将其转换为 NSDATA 并使用 NSURLSession 发布)时,它不起作用。</p>

<p>为什么会这样?
提前致谢</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>如果您想将 JSON 发送到服务器,您应该将内容类型相应地设置为 <code>application/json</code>,而您的内容实际上就是这样:最好以 UTF-8 编码的 JSON。</p >

<p>在您的方法 <code>myServerRequests:</code> 中,您设置了内容类型 <code>application/x-www-form-urlencoded</code> - 但您没有正确设置相应的内容。如何做到这一点可以在这里阅读:<a href="http://www.w3.org/TR/html5/forms.html#url-encoded-form-data" rel="noreferrer noopener nofollow">URL-encoded form data</a> .此外,指定字符集参数完全没有效果。</p>

<p>如果您想为 <code>application/x-www-form-urlencoded</code> 内容类型发送字符串参数,您也不应该使用有损转换。而是使用 UTF-8。请注意,<code>NSString</code>s <code>length</code> 返回 UTF-16 代码点的数量 - 这与 UTF-8 编码字符串的字节数不同。</p >

<p><strong>回顾:</strong> </p>

<p>不要使用 application/x-www-form-urlencoded 内容类型。而是:</p>

<p><code>Content-Type = application/json</code> </p>

<p><code>Content-Length = <UTF-8 编码 JSON 的字节长度></code></p>

<p>当您解决这些问题时,请求应该是正常的。</p>

<p>当使用 multipart/form-data 请求时,我强烈建议使用网络库。手动执行此操作太容易出错,您需要阅读至少 300 份 RFC 才能知道您的操作是否正确;)</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 在 NSURLSession 中发布 json 字符串,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/27022520/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/27022520/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 在 NSURLSession 中发布 json 字符串