【问题标题】:Http post request works fine in postman but not in iOS?Http post 请求在邮递员中工作正常,但在 iOS 中不行?
【发布时间】:2016-09-16 13:59:55
【问题描述】:

我正在使用 RestKit 发出网络请求。我正在使用基本身份验证。我正在尝试对服务器进行后期调用。它给了我 401 错误。但是我在邮递员中采用了相同的请求正文和标头尝试了相同的请求,并且工作正常。

快速编写代码

  let requestMapping: RKObjectMapping = self.defineSyncUserProfileRequestMapping().inverseMapping()
        objectManager.addRequestDescriptor(RKRequestDescriptor(mapping: requestMapping, objectClass: UserProfile.self, rootKeyPath: nil, method: RKRequestMethod.POST))

        let responseMapping = self.defineSyncUserProfileResponseMapping() as RKDynamicMapping

        let responseDesriptor = RKResponseDescriptor(mapping: responseMapping, method: RKRequestMethod.POST, pathPattern: HabitsConstants.WebServicePath.POST_USER_PROFILE, keyPath: "", statusCodes: RKStatusCodeIndexSetForClass(UInt(RKStatusCodeClassSuccessful)))

        objectManager.addResponseDescriptor(responseDesriptor)

        objectManager.requestSerializationMIMEType = RKMIMETypeJSON
        self.objectManager.HTTPClient .setAuthorizationHeaderWithUsername(self.userCredential.username, password: self.userCredential.password)
        self.objectManager.HTTPClient.setDefaultHeader("Content-type" , value: RKMIMETypeJSON)
        RKMIMETypeSerialization.registerClass(RKNSJSONSerialization.self, forMIMEType: "text/json")


        objectManager.postObject(userProfile, path: URL, parameters: nil,
                                 success:{ operation, mappingResult in
                                    let response: NSArray = mappingResult.array()
                                    if response.count > 0 {
                                        if (response.objectAtIndex(0) .isKindOfClass(Error)) {
                                            let error: Error = response.objectAtIndex(0) as! Error
                                            NSLog("ERROR \(error.errorReason)");
                                            self.delegate?.handleMessage(MessageType.ERROR, data: 1.0,errorMessage: error.errorReason)
                                        } else if (response.objectAtIndex(0) .isKindOfClass(UserCredentialResponse)) {
                                            NSLog("Saved profile for user\(userProfile.userId)");
                                            self.getUserProfile()
                                            self.getUserTargets()
                                        }
                                    }

            },
                                 failure:{ operation, error in
                                    NSLog("Error: \(error!.localizedDescription)")
                                    self.delegate?.handleMessage(MessageType.UNKOWN_ERROR, data: 1.0,errorMessage: "")
            }
        )

发布人代码

POST /dmanager/v5/updateprofile/ HTTP/1.1
Host: host.com
Content-Type: application/json
Authorization: Basic aHNoc25hbmE4MjMxOmpzanNqc2pzampz
Cache-Control: no-cache
Postman-Token: 23a32222-db02-b8bb-63cb-da5faffc27be
{"age":23,"phone_number":"","user_id":19709,"weight":25,"key":"jsjsjsjsjjs","set_first_login":"true","first_name":"Suisse","height":91.44,"last_name":"","email":"hshsnana@jsjsja.com","gender":"M"}

【问题讨论】:

  • 您可能需要在 Swift 中显示您的代码,并且可能需要在 POSTMan 中显示“那个”。不看代码,我们无法猜测出什么问题。
  • @Larme 我在 swift 和 postman 中添加了代码
  • 我建议使用 Charles Proxy 来检查您发送的具体内容。 charlesproxy.com。从您的代码中,我看到您为text/json 而不是application/json 注册了序列化程序。你确定它是正确的?

标签: ios objective-c swift restkit


【解决方案1】:

我遇到了类似的问题。来自 Swift 的请求正文与 Postman 请求相同,我收到了来自 Django Rest Framework API 主机的错误请求响应。

邮递员添加 Content-Type 标头,其值为 application/json,如果这是您指定的正文类型。我尝试在我的 Swift iOS 请求客户端中自己设置它(请参阅 this answerFMI),现在我得到了成功的响应。

我用的相关sn-p:

var request = URLRequest(url:renderedUrl)
request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Accept")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 2016-10-23
    • 2019-08-25
    • 2018-10-16
    • 2017-08-16
    • 2020-05-25
    • 2019-05-27
    相关资源
    最近更新 更多