Это работало без проблем, теперь я получаю следующую ошибку, когда использую тот же идентификатор, который я зарегистрировал в запросе:
нет неявного преобразования HTTParty::Response в String (TypeError)
Код:
include HTTParty
base_uri 'http://dummy.restapiexample.com/api/v1'
def create
nome = Faker::UniqueGenerator.clear
nome = Faker::Name.unique.first_name
salario = Faker::Number.number(digits: 2)
idade = Faker::Number.number(digits: 2)
$body = {name: nome, salary: salario, age: idade }.to_json
$headers = {
'Accept' => 'application/vnd.tasksmanager.v2',
'Content-Type' => 'application/json'
}
self.class.post('/create', body: $body, headers: $headers)
end
def retrieve(id)
self.class.get("/employee/#{ id }")
When("the request to change the employee is sent") do
$response = @manter_user.create
expect(@manter_user.create.code).to eq (200)
puts $response.body
{"status":"success","data":{"name":"Patrice","salary":59,"age":39,"id":364},"message":"Successfully! Record has been added."}
@id = JSON.parse($response)['id'] #### error
puts @manter_user.retrieve(@id)
no implicit conversion of HTTParty::Response into String (TypeError)
expect(@manter_user.retrieve(@id).code).to eq (200)
end
Какая линия не работает?
Вероятно, вы хотели сделать JSON.parse($response.body)
, а не JSON.parse($response)
.
Это работало раньше, мой код, который я создаю, и запрашиваю тот же идентификатор. ожидать(@manter_user.retrieve(@id).code).to eq (200)
Поскольку вы предоставили много дополнительной информации в своем другом посте , я создал рабочий пример для вашего ознакомления: https://replit.com/@engineersmnky/APIEXAMPLE#main.rb
Просто чтобы обернуть это:
Ваша ошибка вызвана этой строкой
@id = JSON.parse($response)
Переменная $response
является экземпляром HTTParty::Response
, однако JSON.parse
ожидает String
.
Чтобы решить эту проблему, вы можете использовать $response.body
, который вернет JSON в формате String
для синтаксического анализа. Кроме того, HTTParty
будет автоматически анализировать многие известные форматы, поэтому вы можете пропустить этот шаг и просто использовать $response.parsed_response
, который вернет то же самое.
Ваша вторая проблема заключается в том, что вы пытаетесь получить доступ к «id» в неправильном месте. Ваш ответ имеет следующий формат:
resp = {"status":"success",
"data":{
"name":"Patrice",
"salary":59,
"age":39,
"id":364},
"message":"Successfully! Record has been added."}
Здесь вы можете видеть, что «id» вложен в «данные», но вы пытаетесь получить к нему доступ на верхнем уровне:
resp["id"]
#=> nil
resp["data"]["id"]
#=> 364
IMPORTANT NOTE: I certainly understand how frustrating being a new programmer can be and how that can impact your attitude and approach, but please try to remember you came to SO for help (and lots of commenters tried to help). If you had taken a minute to listen to the comments, with a clear, calm mind, you would see that they were correct about why your error was occurring and if you had tried to implement their changes you would see everything works exactly as expected. I hope this helps you now and in the future. Best of luck!
Браво; респект вам.
Очень благодарен, признаюсь, что я был сбит с толку, потому что он работал отлично. Возможно, в Ruby должны были быть какие-то изменения в отношении драгоценных камней. Я работаю с CodeCeptJS над автоматизацией и хотел оживить этот код. Большое спасибо за ваши слова.
Еще одна вещь: я хотел перечислить всю запись после обновления, а также показать тот же идентификатор, который я показываю при создании, чтобы доказать, что это тот же обновленный идентификатор. СОЗДАТЬ: Данные созданного сотрудника: {"status":"success","data":{"name":"Nell","salary":4462.23,"age":14,"id":5392} ,"message":"Успешноly! Запись добавлена."} Обновить Данные созданного сотрудника: {"status":"success","data":{"name":"Grace","salary ":"4500,28","возраст":"36"},"message":"Успешно! Запись обновлена."}
мой код: @manter_user = Crud.new. parsed_response["data"]["id"] помещает "id: #{id} обновлен так же, как ранее созданный...." puts retrieve_response = manter_user.update(id) помещает "Update Response HTTP code 200: #{ получить_ответ.код == 200}"
@CassiaKlaison, к сожалению, этот API не полностью поддерживает собственную реализацию. Вы можете «создать», и он ответит, вы можете получить идентификаторы до 24, вы можете обновить, но ответ будет искажен, и вы можете «удалить», используя любое число. С этим ничего не поделаешь, он просто сломан. Я обновил свой пример, чтобы показать вам лучше.
Еще раз спасибо!!!! у тебя доброе сердце!!
@engineersmnky мой лучший друг я запостил новую задачу, что если я ее решу, то все закончу. Я хочу использовать один и тот же идентификатор для перечисления, изменения и удаления, я получаю код ошибки 200. Код HTTP 200: #{$response.code == 200}" #List $id = $response.parsed_response["data"]["id"] помещает "@id: #{$id} возвращается тот же самый ранее созданный ..." retrieve_response = $manter_user.retrieve($id) помещает "Получить HTTP-код ответа 200: #{retrieve_response.code == 200}" end
Совет: держитесь подальше от глобальных переменных, таких как
$response
. Это не PHP. Переменные Ruby — это простоresponse = ...